static int x86_compat(int xc, domid_t domid, char *guest_type)
{
-#ifdef XEN_DOMCTL_set_compat
static const struct {
char *guest;
- unsigned long cmd;
+ uint32_t size;
} types[] = {
- { "xen-3.0-x86_32p", XEN_DOMCTL_set_compat },
- { "xen-3.0-x86_64", XEN_DOMCTL_set_native },
+ { "xen-3.0-x86_32p", 32 },
+ { "xen-3.0-x86_64", 64 },
};
DECLARE_DOMCTL;
int i,rc;
memset(&domctl, 0, sizeof(domctl));
domctl.domain = domid;
+ domctl.cmd = XEN_DOMCTL_set_address_size;
for (i = 0; i < sizeof(types)/sizeof(types[0]); i++)
if (0 == strcmp(types[i].guest, guest_type))
- domctl.cmd = types[i].cmd;
- if (0 == domctl.cmd)
+ domctl.u.address_size.size = types[i].size;
+ if (0 == domctl.u.address_size.size)
/* nothing to do */
return 0;
- xc_dom_printf("%s: guest %s, cmd %d\n", __FUNCTION__,
- guest_type, domctl.cmd);
+ xc_dom_printf("%s: guest %s, address size %" PRId32 "\n", __FUNCTION__,
+ guest_type, domctl.u.address_size.size);
rc = do_domctl(xc, &domctl);
if (0 != rc)
xc_dom_printf("%s: warning: failed (rc=%d)\n",
__FUNCTION__, rc);
return rc;
-#else
- xc_dom_printf("%s: compiled without compat/native switching\n", __FUNCTION__);
- return 0;
-#endif /* XEN_DOMCTL_set_compat */
}
}
break;
+ case XEN_DOMCTL_set_address_size:
+ {
+ struct domain *d;
+
+ ret = -ESRCH;
+ if ( (d = find_domain_by_id(domctl->domain)) == NULL )
+ break;
+
+ switch ( domctl->u.address_size.size )
+ {
+#ifdef CONFIG_COMPAT
+ case 32:
+ ret = switch_compat(d);
+ break;
+ case 64:
+ ret = switch_native(d);
+ break;
+#endif
+ default:
+ ret = (domctl->u.address_size.size == BITS_PER_LONG) ? 0 : -EINVAL;
+ break;
+ }
+
+ put_domain(d);
+ }
+
+ case XEN_DOMCTL_get_address_size:
+ {
+ struct domain *d;
+
+ ret = -ESRCH;
+ if ( (d = find_domain_by_id(domctl->domain)) == NULL )
+ break;
+
+ domctl->u.address_size.size = BITS_PER_GUEST_LONG(d);
+
+ ret = 0;
+ put_domain(d);
+ }
+
default:
ret = -ENOSYS;
break;
} xen_domctl_hvmcontext_t;
DEFINE_XEN_GUEST_HANDLE(xen_domctl_hvmcontext_t);
+#define XEN_DOMCTL_set_address_size 35
+#define XEN_DOMCTL_get_address_size 36
+typedef struct xen_domctl_address_size {
+ uint32_t size;
+} xen_domctl_address_size_t;
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_address_size_t);
+
#define XEN_DOMCTL_real_mode_area 26
struct xen_domctl_real_mode_area {
uint32_t log; /* log2 of Real Mode Area size */
struct xen_domctl_settimeoffset settimeoffset;
struct xen_domctl_real_mode_area real_mode_area;
struct xen_domctl_hvmcontext hvmcontext;
+ struct xen_domctl_address_size address_size;
uint8_t pad[128];
} u;
};